Poetry- 打包和依赖管理
Poetry- 打包和依赖管理
官方文档:https://python-poetry.org/docs/
Github:GitHub - python-poetry/poetry: Python packaging and dependency management made easy
安装/卸载
先创建环境变量 POETRY_HOME
,其值为 Poetry 的安装路径,我设置的是 D:\Poetry
如果不设置这个环境变量直接运行下面的脚本,则会安装到
%APPDATA%\pypoetry
,我本地是C:\Users\wwwli\AppData\Roaming\pypoetry
然后执行
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
然后将 D:\Poetry\bin
添加到 Path
这个环境变量中,再新开一个 powershell 窗口输入 poetry --version
,如果可以正常输出版本,即安装成功
如果没有自定义安装目录,那就是将
C:\Users\wwwli\AppData\Roaming\Python\Scripts
添加到PATH
中
PS C:\Windows\System32> poetry --version
Poetry (version 1.5.1)
然后执行,这样,Bash 就能支持 Poetry 的命令补全
poetry completions bash >> ~/.bash_completion
之后,我们可以通过 poetry self update
来检查升级,Poetry 可以通过这个命令自己升级自己
卸载脚本为
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py - --uninstall
执行即可卸载
命令行下的使用
根据模板创建项目
poetry new PoetryProject
在执行命令的目录创建一个项目,之后我们可以通过 Pycharm 导入这个项目,注意导入之后,默认使用的是主解释器环境而不是 Poetry 中的虚拟环境,我们需要在设置中更换项目的解释器为 Poetry 环境下的解释器,更换之后,就开始使用使用虚拟环境,我们可以注意到已下载的包的列表的刷新。
在 Python 项目的根目录下执行 poetry init
可以以一种交互式的方式为项目生成 pyproject.toml
文件
指定源
我们可以在这里指定非官方源,比如官方源的镜像,比如阿里云,也可以执行自己的源,比如自己的私服,跟 Maven 私服一样,Python 也可以有私服,不手动指定源的话默认使用 PyPI
我们在指定源的时候需要指定其优先级,查找依赖的时候会按照优先级挨个查找源,优先级高的源里查不到就从排在后面的源里查,
如果源连不上,那就会直接报错,PyPI 经常连不上,所以我们建议手动设置其他院为默认源,替换掉 PyPI
源的优先级从高到低为:
- default source,
- primary sources,
- implicit PyPI (unless disabled by another default source or configured explicitly),
- secondary sources (DEPRECATED),
- supplemental sources.
如果有多个源位于同意优先级,则按照在 pyproject.toml
中的出现顺序为其排序顺序。
缓存
为了改善用户体验和避免重复的网络请求,Poetry 为包源使用了多个缓存。第一级缓存是基于缓存控制头的缓存,用于几乎所有 HTTP 请求。此外,每个 HTTP 支持的包源都会在获取或生成包时缓存与包相关的元数据。此外,下载的文件 (包发行版) 也会被缓存。
指定依赖
在 pyproject.toml
文件的 tool.poetry.dependencies
下有四种指定依赖版本的方式
-
插入符
^
-
波浪号
~
-
通配符符
*
-
不等式(最直观):
除了引入源中的包,我们还可以引入其他类型的来源的包
-
git 中的包,git 属性
-
本地的包(源码包或者二进制包),path 属性
-
网络上文件服务器中的包,url 属性
我们在指定依赖的版本的时候,也可以指定依赖来自于哪个源(source 属性),比如我们自己的私服
你还可以指定仅为特定的 Python 版本安装依赖项(python 属性)
如果需要为依赖项提供更复杂的安装条件,Poetry 可以通过 markers 属性支持环境标记
简而言之就是,我们在执行依赖的时候,可以指定这个依赖的生效条件,我们甚至可以为不同的 python 版本指定不同的包的版本,为不同的依赖的版本指定不同的类型的来源这些都是可以做到的
当我们修改了 pyproject.toml
文件的时候,pycharm 会弹出提示,提示我们可以更新项目,执行 poetry lock
或者 poetry update
poetry update
:更新(依赖要求的版本限制范围内的)最新版本的依赖,并更新 poetry.lock
比如你在
pyproject.toml
中制定了依赖的最高版本为 1.0,现在有一个 1.1 的版本来了,调用poetry update
也是不会更新的
poetry lock
:This command locks (without installing) the dependencies specified in 将 pyproject.toml
中指定的依赖项的信息记录到 poetry.lock
文件中
poetry.lock
文件中最有价值的信息就是依赖的版本和 hash,这样当别人拿到这个项目,然后打包的时候,通过对比就能看出,这个环境下下载的依赖跟原先的环境下载的是不是同一个依赖,这样就可以确保确定性构建和依赖项解析。这样,在不同环境打包和安装就有了一致性的保证。
虚拟环境
把虚拟环境的安装目录也换到一个专门的目录中,比如 poetry_virtual 中
poetry 仍然需要
通过 poetry new PoetryProject
创建了项目之后,依然需要手动创建一个虚拟环境,再用 pycharm 打开的时候,pycharm 才能默认使用这个虚拟环境,有意思,TODO,其实这个一些 Pycharm 应该是可以做成自动化的步骤的,但是,他没有,说明还有优化空间,
poetry env list
查看所有虚拟环境
poetry env info
查看所有虚拟环境的信息,比如所保存的路径,状态等等。
大的环境管理。
可能做不到,不能做到创建不同版本的虚拟环境,也就是 poetry 只能做到同一版本的环境,不同项目使用不同版本的依赖,也就是包隔离,但是做不到管理不同的版本,
管理不同的版本,得依赖 pyenv,这个在文章《pyenv- 环境管理.md》中有所介绍,装完了 pyenv 之后,再来看,这部分,TODO,
把这个搞完,包管理基本上就搞完了,TODO
还要搞清楚怎么打包
Pycharm 中的使用
按照官方的脚本出问题了,得改脚本,操!
或者上网搜一下。
通过设置 powershell 的网络代理解决,《powershell_note.md》的
lesson5 变量
小节
安装 poetry 的过程中出现了依赖冲突,我怀疑是跟我本地已经下载的包出现了冲突,所以我把本地的包清零看看。
我算是第一次感觉到依赖地狱(dependency hell)了
解决包管理冲突 pipdeptree,下载 pip install pipdeptree
,然后直接运行 pipdeptree
即可,非常方便,
Pycharm 集成了吗?
https://towardsdatascience.com/configure-a-poetry-environment-that-runs-in-pycharm-eba47420f0b6
看这个文章,感觉命令行更好用,直接编辑 pyproject.toml
文件反而不好用了。